package com.zzh.tools.utils;

import android.text.TextUtils;
import android.util.Log;

/**
 * @author zhangzhihao
 * @email zhangzhihao@gongjiangren.net
 * @date 2020-07-04
 * @desc
 */
public class ToolLog {

    /**
     * 日志输出级别V
     */
    public static final int LEVEL_VERBOSE = 5;
    /**
     * 日志输出级别D
     */
    public static final int LEVEL_DEBUG = 4;
    /**
     * 日志输出级别I
     */
    public static final int LEVEL_INFO = 3;
    /**
     * 日志输出级别W
     */
    public static final int LEVEL_WARN = 2;
    /**
     * 日志输出级别E
     */
    public static final int LEVEL_ERROR = 1;
    /**
     * 日志输出级别NONE
     */
    public static final int LEVEL_NONE = 0;

    public static final int MAX_LENGTH = 2000;

    /**
     * 是否允许输出log  默认是 0
     */
    private static int mDebuggable = LEVEL_VERBOSE;
    /**
     * 日志输出时的TAG
     */
    private static String mTag = "Craftsman";

    private static String className;

    private static String methodName;

    private static int lineName;

    /**
     * 设置日志级别
     */
    public static void setLogLevel(int logLevel) {
        mDebuggable = logLevel;
    }

    /**
     * 以级别为 d 的形式输出LOG
     */
    public static void v(String msg) {
        v(mTag, msg);
    }

    public static void v(String tag, String msg) {
        if(TextUtils.isEmpty(msg) || TextUtils.isEmpty(tag)){
            return;
        }
        if (mDebuggable >= LEVEL_VERBOSE) {
            while (msg.length() > MAX_LENGTH) {
                Log.v(tag, msg.substring(0, MAX_LENGTH));
                msg = msg.substring(MAX_LENGTH);
            }
            Log.v(tag, msg);
        }
    }

    /**
     * 以级别为 d 的形式输出LOG
     */
    public static void d(String msg) {
        d(mTag, msg);
    }

    public static void d(String tag, String msg) {
        if(TextUtils.isEmpty(msg) || TextUtils.isEmpty(tag)){
            return;
        }
        if (mDebuggable >= LEVEL_DEBUG) {
            while (msg.length() > MAX_LENGTH) {
                Log.d(tag, msg.substring(0, MAX_LENGTH));
                msg = msg.substring(MAX_LENGTH);
            }
            Log.d(tag, msg);
        }
    }

    /**
     * 以级别为 i 的形式输出LOG
     */
    public static void i(String msg) {
        i(mTag, msg);
    }

    public static void i(String tag, String msg) {
        if(TextUtils.isEmpty(msg) || TextUtils.isEmpty(tag)){
            return;
        }
        if (mDebuggable >= LEVEL_INFO) {
            while (msg.length() > MAX_LENGTH) {
                Log.i(tag, msg.substring(0, MAX_LENGTH));
                msg = msg.substring(MAX_LENGTH);
            }
            Log.i(tag, msg);
        }
    }

    /**
     * 以级别为 w 的形式输出LOG
     */
    public static void w(String msg) {
        w(mTag, msg);
    }

    public static void w(String tag, String msg) {
        if(TextUtils.isEmpty(msg) || TextUtils.isEmpty(tag)){
            return;
        }
        if (mDebuggable >= LEVEL_WARN) {
//            getName(new Throwable().getStackTrace());
//            msg = createLog(msg);
            while (msg.length() > MAX_LENGTH) {
                Log.w(tag, msg.substring(0, MAX_LENGTH));
                msg = msg.substring(MAX_LENGTH);
            }
            Log.w(tag, msg);
        }
    }

    /**
     * 以级别为 w 的形式输出Throwable
     */
    public static void w(Throwable tr) {
        w("", tr);
    }

    /**
     * 以级别为 w 的形式输出LOG信息和Throwable
     */
    public static void w(String msg, Throwable tr) {
        if (mDebuggable >= LEVEL_WARN && null != msg) {
            getName(new Throwable().getStackTrace());
            msg = createLog(msg);
            Log.w(mTag, msg, tr);
        }
    }

    /**
     * 以级别为 e 的形式输出LOG
     */
    public static void e(String msg) {
        e(mTag, msg);
    }

    public static void e(String tag, String msg) {
        if(TextUtils.isEmpty(msg) || TextUtils.isEmpty(tag)){
            return;
        }
        if (mDebuggable >= LEVEL_ERROR) {
//            getName(new Throwable().getStackTrace());
//            msg = createLog(msg);
            while (msg.length() > MAX_LENGTH) {
                Log.e(tag, msg.substring(0, MAX_LENGTH));
                msg = msg.substring(MAX_LENGTH);
            }
            Log.e(tag, msg);
        }
    }

    /**
     * 以级别为 e 的形式输出Throwable
     */
    public static void e(Throwable tr) {
        e("", tr);
    }

    /**
     * 以级别为 e 的形式输出LOG信息和Throwable
     */
    public static void e(String msg, Throwable tr) {
        if (mDebuggable >= LEVEL_ERROR && null != msg) {
            Log.e(mTag, msg, tr);
        }
    }


    private static void getName(StackTraceElement[] stackTraceElements) {
        className = stackTraceElements[1].getClassName();
        methodName = stackTraceElements[1].getMethodName();
        lineName = stackTraceElements[1].getLineNumber();
    }

    private static String createLog(String msg) {
        StringBuilder sb = new StringBuilder();
        return sb.append(className).append(methodName).append(lineName).append(":").append(msg).toString();
    }

}
